﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.ServiceModel.Activation;
using DTO;
using System.IO;


namespace DataProviderService
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class RegOnlineDPS : IRegOnlineDPS
    {
        public String GetKafedra(int id_UP)
        {
            var db = new RegOnlineDBDataContext();
            var v = from UP in db.Content_UchPls
                    join K in db.kafedras on UP.ik_kaf equals K.ik_kaf
                    where UP.ik_upContent == id_UP
                    select K.cname_kaf;
            return v.First();
    
        }

        public String GetFioPrepod(int id_UP )
        {
           
            var db = new RegOnlineDBDataContext();
            var v = from UP in db.Content_UchPls
                    join K in db.kafedras on UP.ik_kaf equals K.ik_kaf
                    join PN in db.Plan_nagr on K.ik_kaf equals PN.ik_kaf
                    join CPN in db.Content_plan_nagr on PN.ik_plan_nagr equals CPN.ik_plan_nagr
                    join PPN in db.Prepod_plan_nagr on CPN.ik_plan_nagr equals PPN.Content_plan_nagr.ik_plan_nagr

                    where UP.ik_upContent == id_UP
                    select PPN.Relation_kafedra_prep.Prepod.Person;
            Person p = v.FirstOrDefault();
            return p.Clastname + " " + p.Cfirstname[0] + ". " + p.Cotch[0] + ".";

        }

        public string GetFacultet(int idUspevDocs)
        {
           
            var db = new RegOnlineDBDataContext();
            var v = from UD in db.UspevDocuments
                    join Z in db.Zaches on UD.ik_zach equals Z.Ik_zach
                    join SG in db.StudGrups on Z.Ik_zach equals SG.Ik_zach
                    join G in db.Grups on SG.Ik_grup equals G.Ik_grup
                    where UD.idUspevDocs == idUspevDocs
                    select G.Relation_spec_fac.Fac.Cname_fac;
            return v.First();

        }

        public string GetSpecialnost(int idUspevDocs)
        {
           
            var db = new RegOnlineDBDataContext();
            var v = from UD in db.UspevDocuments
                    join Z in db.Zaches on UD.ik_zach equals Z.Ik_zach
                    join SG in db.StudGrups on Z.Ik_zach equals SG.Ik_zach
                    join G in db.Grups on SG.Ik_grup equals G.Ik_grup
                    where UD.idUspevDocs == idUspevDocs
                    select G.Relation_spec_fac.Spec_stud.Cname_spec;
            return v.First();
        }

        public IEnumerable<DTO.Prepod> GetPrepods()
        {

            var db = new RegOnlineDBDataContext();
            var Prepods = db.Prepods.Select(s => DTOConverter.Instance.CreatePrepod(s)).ToArray();
            return Prepods;


        }

        public IEnumerable<DTO.Student> GetStudents()
        {

            var db = new RegOnlineDBDataContext();
            var Studs = db.Students.Select(s => DTOConverter.Instance.CreateStudent(s)).ToArray();
            return Studs;
        }

        public IEnumerable<DTO.Group> GetGrupStud(int Idstud)
        {
            var db = new RegOnlineDBDataContext();
            var grup = db.StudGrups.Where(w => w.Zach.nCode == Idstud).Select(s => new DTO.Group
            {
                IdGrup = s.Ik_grup,
                grupName = s.Grup.Cname_grup,
            }).ToArray();
            return grup;
        }

        public IEnumerable<DTO.Semestr> GetStudSemAndUchPlan(int Idstud, int IdGrup)
        {
            var db = new RegOnlineDBDataContext();
            var semestr = db.Semesters.Select(s => DTOConverter.Instance.CreateSemestr(s)).ToArray();
            foreach (var item in semestr)
            {
                var e = db.PPlanStudentSemesterbt(Idstud, item.SemNum, IdGrup).ToArray();

                item.Up = new List<DTO.UchPlan>();
                foreach (var item2 in e)
                {
                    var uchPl = new DTO.UchPlan
                    {
                        IdUP = item2.ik_upContent,
                        Dis = new DTO.Discipline
                        {
                            DisName = item2.Дисциплина,
                            IdDis = item2.id_дисциплины,
                        },

                        Vid = new DTO.VidWork
                        {
                            VidWorkName = item2.Вид_работы,
                            IdVid = item2.id_занятия,
                        },
                        Ws = new DTO.Work
                        {
                            
                            RegNum = item2.Регистрационный__,
                            RegDate = item2.Дата,
                            theme = item2.тема,
                        }
                        

                    };
                    item.Up.Add(uchPl);
                }
            }
            return semestr;


        }
     
        public IEnumerable<DTO.Work> GetWork(int IdDis, int IdVid, int SemNum, int studId)
        {
            var db = new RegOnlineDBDataContext();
            var e = db.PWorkStudentSELECT(IdDis, IdVid, SemNum, studId).ToArray();
            return e.Select(item1 => new DTO.Work
                                         {
                                             IdWork = item1.idРаботы, theme = item1.Тема, options = item1.Вариант, RegNum = item1.Регистрационный_номер, RegDate = item1.Дата_регистрации,
                                         }).ToList();

        }

        public IEnumerable<DTO.ReqsWork> GetReqWorkANDLoadWork(int IdDis, int IdVid, int SemNum, int studId)
        {
            var db = new RegOnlineDBDataContext();
            var e = db.PReqWorkSELECT(IdDis, IdVid, SemNum, studId).ToArray();
            var req = new List<DTO.ReqsWork>();
            foreach (var item1 in e)
            {
                var Req = new DTO.ReqsWork
                {
                    IdListReq = item1.idЛиста_требований,
                    IdReqWork = item1.idТребования_к_работе,
                    IdUP = item1.idучебного_плана,
                    LR = new DTO.ListReq()
                    {
                        IdListReq = item1.idЛиста_требований,
                        IdReqWork = item1.idТребования_к_работе,
                        IdRefReq = item1.idНазвания_требования,
                        expdoc = item1.Расширение_файла,
                        lWs = new DTO.LoadWork()
                        {
                            IdListReq = item1.idЛиста_требований,
                            SistemNum = item1.idЗагруженного_файла,
                            DateLoad = item1.Дата_загрузки_файла,
                        },
                        RR = new DTO.RefReq
                        {
                            IdRefReq = item1.idНазвания_требования,
                            nameReq = item1.Название_требования,
                        },
                    },
                };
                req.Add(Req);
            }
            return req;
            
        }

        public IEnumerable<DTO.godUP> GetGodUP()
        {
            var db = new RegOnlineDBDataContext();
            var Gods = db.Year_uch_pls.Select(s => new DTO.godUP { IdGod = s.ik_year_uch_pl, NameGod = s.year_value }).ToArray();
            return Gods;
        }

        public IEnumerable<DTO.TypeSem> GetTypeSem()
        {
            var db = new RegOnlineDBDataContext();
            var Sems = db.SemesterTypes.Select(s => new DTO.TypeSem { IdTypeSem = s.ik_sem_type, NameSemType = s.Cname_sem_type }).ToArray();
            return Sems;

        }

        public IEnumerable<DTO.Group> GetGrupPrepodAndUchPlan(int IdGod, int IdTypeSem, int prepId)
        {
            var db = new RegOnlineDBDataContext();
            var e = db.PPrepodGrupsSELECT(IdGod, IdTypeSem, prepId).ToArray();
            var Grups = new List<DTO.Group>();
            foreach (var item1 in e)
            {
                var GP = new DTO.Group
                {
                    IdGrup = item1.idгруппы,
                    grupName = item1.название_группы
                };
                Grups.Add(GP);
            }
            foreach (var item in Grups)
            {
                var e1 = db.PUchPlanReqWorkSELECT(IdGod, IdTypeSem, item.IdGrup, prepId).ToArray();

                item.Up = new List<DTO.UchPlan>();
                foreach (var item2 in e1)
                {
                    var uchPl = new DTO.UchPlan()
                    {
                        IdUP = item2.idУчПлана,
                        Dis = new DTO.Discipline
                        {
                            DisName = item2.Название_дисциплины,
                            IdDis = item2.IDдисциплины,
                        },
                        Vid = new DTO.VidWork
                        {
                            VidWorkName = item2.Вид_работы,
                            IdVid = item2.IDвида_работы,
                        },
                    };
                    item.Up.Add(uchPl);
                }
            
            }
           

            return Grups;
        }

        public string GetFukultet (int idSpec)
        {
            var db = new RegOnlineDBDataContext();
            var res = db.Relation_spec_facs.Where(x => x.Spec_stud.Ik_vip_dep == idSpec).Select(y => y.Fac.Cshort_name_fac).ToString();
            return res ?? "";
        }

        public IEnumerable<DTO.ReqsWork> GetReqWork(int IdGod, int IdTypeSem, int IdDis, int IdVid, int IdGrup, int prepId)
        {
            var db = new RegOnlineDBDataContext();
            var e = db.PReqWorkForPrepodSELECT(IdGod, IdTypeSem, IdDis, IdVid, IdGrup, prepId).ToArray();
            var req = e.Select(item1 => new DTO.ReqsWork
                                            {
                                                IdListReq = item1.idЛиста_требований, IdReqWork = item1.idТребования_к_работе, LR = new DTO.ListReq
                                                                                                                                        {
                                                                                                                                            IdListReq = item1.idЛиста_требований, IdReqWork = item1.idТребования_к_работе, IdRefReq = item1.idНазвания_требования, expdoc = item1.Расширение_файла, RR = new DTO.RefReq
                                                                                                                                                                                                                                                                                                             {
                                                                                                                                                                                                                                                                                                                 IdRefReq = item1.idНазвания_требования, nameReq = item1.Название_требования,
                                                                                                                                                                                                                                                                                                             }
                                                                                                                                        }
                                            }).ToList();
            return req;

        }

        public IEnumerable<DTO.RefReq> GetReq()
        {
            var db = new RegOnlineDBDataContext();
            var req = db.RefReqs.Select(s => DTOConverter.Instance.CreateRefReq(s)).ToArray();
            return req;
        }


        public void InsertReqWork(int NameGod, int IdUP, int idReq, string Expdoc)
        {
            var db = new RegOnlineDBDataContext();

            try
            {
                db.PListReqANDReqWorkINSERT(NameGod, IdUP, idReq, Expdoc);
            }
            catch (Exception exception)
            {

                throw new Exception("Требование не вставлено. Ошибка: " + exception.Message);
            }
        }


        public void DeleteListReq(int IdListReq)
        {
            var db = new RegOnlineDBDataContext();
            var temp = db.ListReqs.Where(s => s.Ik_ListReq == IdListReq).Select(s => s).First();
            db.ListReqs.DeleteOnSubmit(temp);
            db.SubmitChanges();
        }

        public void InsertRefReq(string nameReq)
        {
            var db = new RegOnlineDBDataContext();
            var temp = new RefReq();
            temp.NameReq = nameReq;
            db.RefReqs.InsertOnSubmit(temp);
            db.SubmitChanges();
        }

        public IEnumerable<DTO.Discipline> GetDis(int IdGod, int IdTypeSem, int IdGrup, int Idprep)
        {
            var db = new RegOnlineDBDataContext();
            var e = db.PUPDisSELECT(IdGod, IdTypeSem, IdGrup, Idprep).ToArray();
            return e.Select(item => new DTO.Discipline
                                        {
                                            IdDis = item.IDдисциплины, DisName = item.Название_дисциплины,
                                        }).ToList();
        }

        public IEnumerable<DTO.VidWork> GetVid(int IdGod, int IdTypeSem, int IdGrup, int IdDis, int Idprep)
        {
            var db = new RegOnlineDBDataContext();
            var e = db.PDisVidWorkSELECT(IdGod, IdTypeSem, IdGrup, IdDis, Idprep).ToArray();
            return e.Select(item => new DTO.VidWork
                                        {
                                            IdVid = item.IDвида_работы, VidWorkName = item.Вид_работы,
                                        }).ToList();
            
        }

        public IEnumerable<DTO.Work> OtchetZar(int IdGod, int IdTypeSem, int IdGrup, int Idprep, int IdDis, int IdVid, DateTime data1, DateTime data2)
        {
            var db = new RegOnlineDBDataContext();
            var e = db.PZaregWordSELECT(IdGod, IdTypeSem, IdGrup, Idprep, IdDis, IdVid, data1, data2).ToArray();
            return e.Select(item1 => new DTO.Work
                                         {
                                             theme = item1.Тема, IdWork = item1.idРаботы, options = item1.Вариант, RegNum = item1.Регистрационный__, RegDate = item1.Дата_регистрации, St = new DTO.Student()
                                                                                                                                                                                                {
                                                                                                                                                                                                    zach = new DTO.Zachet()
                                                                                                                                                                                                               {
                                                                                                                                                                                                                   IdZach = item1.idзачетки, nZach = item1.Зачетка,
                                                                                                                                                                                                               }, person = new DTO.Person()
                                                                                                                                                                                                                               {
                                                                                                                                                                                                                                   FirstName = item1.Фамилия, LastName = item1.Имя, Patronymic = item1.Отчество, IDPerson = (int) item1.isСтудента,
                                                                                                                                                                                                                               }
                                                                                                                                                                                                }
                                         }).ToList();
        }

       

        public void DeleteFile(int SistemNum)
        {
            var db = new RegOnlineDBDataContext();
            try
            {
                var temp = db.ResultWorks.Where(s => s.SystemNumber == SistemNum).Select(s => s).First();
                db.ResultWorks.DeleteOnSubmit(temp);
                db.SubmitChanges();
            }
            catch(Exception exception)
            {

                throw new Exception("Работа не удалена. Ошибка: " + exception.Message);
            }
        }
       
        public void InsertWorkTheme(int IdUP, int IdZach, decimal? options, string theme)
        {
            var db = new RegOnlineDBDataContext();
            try
            {
                var e = db.PUspevKPThemeINSERTTheme(IdUP, IdZach, options, theme);

            }
            catch (Exception exception)
            {

                throw new Exception("Тема не вставлена. Ошибка: " + exception.Message);
            }
            
        }



        public void SaveFile(int IdListReq, int IdWork, byte[] load)
        {

        var db = new RegOnlineDBDataContext();
        var e = db.PResultWorkINSERT(IdListReq, IdWork, load);
        
        }

        public void InsertWorkRegNum (int IdWork)
        {
            var db = new RegOnlineDBDataContext();
            var e = db.PUspevKPThemeINSERTReg(IdWork);
        }


        public void UpdateWork(int IdWork, string theme, decimal? options)
        {
            var db = new RegOnlineDBDataContext();
            var e = db.PUspevKPThemeUpdate(IdWork, theme, options);
        }
     }
   }

    


